package com.darwin.darwinDll.core
{
	import com.darwin.darwinDll.Dll;
	import com.darwin.darwinUtils.Priority;
	
	import flash.utils.ByteArray;
	import flash.utils.getTimer;

	/**
	 *	加载项 
	 * @author Roland
	 * 
	 */
	public class DllItem
	{
		//---------------------------------------------------------------------
		//  静态常量
		//---------------------------------------------------------------------
		//文件类型
		/** swf文件 */		
		public static const TYPE_SWF:String = "swf";
		/** xml文件  */		
		public static const TYPE_XML:String = "xml";
		/** json文件 */		
		public static const TYPE_JSON:String = "json";
		/** 图片文件 */		
		public static const TYPE_IMG:String = "img";
		/** 声音文件 */		
		public static const TYPE_SOUND:String = "sound";
		/** 主程序文件 */		
		public static const TYPE_MAIN:String = "main";
		/** 模块文件*/		
		public static const TYPE_MODULE:String = "module";
		/** ddd文件*/		
		public static const TYPE_DDD:String = "ddd";
		/** 二进制流 */		
		public static const TYPE_BIN:String = "bin";
		/** dar文件 */		
		public static const TYPE_DAR:String = "dar";
		/** darx文件 */		
		public static const TYPE_DARX:String = "darx";
		//加载状态
		/** 加载状态： 已加载完成*/
		public static const STATUS_LOADED:String = "loaded";
		/** 加载状态： 正在载入中*/
		public static const STATUS_LOADING:String = "loading";
		/** 加载状态： 未载入的*/
		public static const STATUS_NOT_LOADED:String = "notLoaded";
		
		//---------------------------------------------------------------------
		//  公共变量
		//---------------------------------------------------------------------
		/**
		 *	要加载的文件地址 
		 */
		public var url:String;
		/**
		 *	 加载项名称
		 */
		public var name:String;
		
		/**
		 *	加载项id
		 */
		public var id:String;
		
		/**
		 *	此加载项是否是索引表 或其他
		 */
		public var flag:String = "";
		/**
		 *	 该项加载状态
		 * <br>通过DllItem中的静态常量定义
		 * <li>DllItem.STATUS_LOADED</li>
		 * <li>DllItem.STATUS_LOADING</li>
		 * <li>DllItem.STATUS_NOT_LOADED</li>
		 */
		public var status:String = STATUS_NOT_LOADED;
		
		/**
		 *	加载项文件类型
		 * <br>通过DllItem中的静态常量定义
	 	 * <li>DllItem.TYPE_SWF</li>
		 * <li>DllItem.TYPE_XML</li>
		 * <li>DllItem.TYPE_JSON</li>
		 * <li>DllItem.TYPE_IMG</li>
		 * <li>DllItem.TYPE_SOUND</li>
		 * <li>DllItem.TYPE_MAIN</li>
		 * <li>DllItem.TYPE_MODULE</li>
		 * <li>DllItem.TYPE_DDD</li>
		 * <li>DllItem.TYPE_BIN</li>
		 * <li>DllItem.TYPE_DAR</li>
		 */
		public var type:String;
		
		/**
		 *	加载项解析完成后的二进制数据
		 */
		public var data:ByteArray;
		
		/**
		 *	加载项解析完成后的对象 
		 */
		public var result:Object;
		
		/**
		 *	 加载完成后的回调
		 */
		private var _completeFuncList:Vector.<Function> = new Vector.<Function>();
		
		/**
		 *	加载项文件大小(kb) 
		 */
		public var size:int;

		/**
		 *	是否需要做CRC校验 
		 */
		public var needCRC:Boolean = true;
		/**
		 * 该加载项所属组名 
		 */		
		public var groupName:String = "";
		
		//---------------------------------------------------------------------
		//  私有变量
		//---------------------------------------------------------------------
		
		private var _startTime:int;//加载开始时间
		private var _endTime:int;//加载结束时间 
		
		//加载优先值
		private var _priority:int;
		
		
		
		//---------------------------------------------------------------------
		//  setter
		//---------------------------------------------------------------------
		
		/**
		 *	设置加载开始时间 (ms)
		 * @param time
		 * 
		 */
		public function set startTime(time:int):void
		{
			_startTime = time;
		}
		
		/**
		 *	设置加载结束时间 (ms)
		 * @param time
		 * 
		 */
		public function set endTime(time:int):void
		{
			_endTime = time;
		}
		
		//---------------------------------------------------------------------
		//  getter
		//---------------------------------------------------------------------
		/**
		 *	整个文件加载耗费的时间 (ms)
		 */
		public function get loadTime():int
		{
			return _endTime - _startTime;
		}

		public function get completeFuncList():Vector.<Function>
		{
			return _completeFuncList.concat();
		}

		
		//---------------------------------------------------------------------
		//  构造函数
		//---------------------------------------------------------------------
		public function DllItem(url:String,name:String,completeFunc:Function=null,priority:int = Priority.HIGH,type:String= DllItem.TYPE_SWF,size:int = 0,needCRC:Boolean = true)
		{
			this.url = url;
			this.name = name;
			this.size = size;
			this.type = type;
			this.needCRC = needCRC;
			this.priority = priority;
			registerCompleteFunc(completeFunc);
		}
		
		/**
		 * 注册一个该项加载完成后的回调 
		 * @param func
		 * 
		 */		
		public function registerCompleteFunc(func:Function):void
		{
			if(_completeFuncList!=null && func != null)
			{
				_completeFuncList.push(func);
			}
		}
		
		/**
		 * 移除一个加载完成后的回调 
		 * @param func
		 * 
		 */		
		public function removeCompleteFunc(func:Function):void
		{
			var index:int = _completeFuncList.indexOf(func);
			if(index != -1)
			{
				_completeFuncList.splice(index,1);
			}
		}
		
		/**
		 * 移除所有加载完成回调方法 
		 * 
		 */		
		public function removeAllCompleteFunc():void
		{
			_completeFuncList.length = 0;
		}

		/**
		 * 加载优先值
		 * Priority.HIGH Priority.MEDIUM Priority.LOW 
		 */
		public function get priority():int
		{
			return _priority;
		}

		/**
		 * @private
		 */
		public function set priority(value:int):void
		{
			_priority = value;
		}


	}
}